package com.yidian.demotickets.SAXPrint;

import android.util.Log;

import com.yidian.demotickets.entity.SvgContentEntity;
import com.yidian.demotickets.entity.SvgEntity;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by bmc on 2017/10/18.
 */

public class MySaxHandler extends DefaultHandler {
    //存储正在解析的元素的数据
    private SvgContentEntity contentEntity;
    //存储所有解析的元素的数据
    private SvgEntity svgEntity;
    private List<SvgContentEntity> list=null;
    //正在解析的元素的名字
    String currentTag=null;
    //正在解析的元素的元素值
    String currentValue=null;
    //开始解析的元素
    String nodeNameText="text";
    String nodeNameLine="line";


    public MySaxHandler() {
    }

    public SvgEntity getSvgEntity() {
        return svgEntity;
    }

    //开始解析文档，即开始解析XML根元素时调用该方法
    @Override
    public void startDocument() throws SAXException {
        svgEntity=new SvgEntity();
        list=new ArrayList<>();
    }

    //开始解析每个元素时都会调用该方法
    @Override
    public void startElement(String uri, String localName, String qName,
                             Attributes attributes) throws SAXException {

        //含有 text line标签的 都属于实体
        if(qName.equals(nodeNameText)||qName.equals(nodeNameLine)){
            contentEntity=new SvgContentEntity();
        }
        //如果是line标签 直接给实体赋值category为1
        if(qName.equals(nodeNameLine)){
            contentEntity.setCategory(1);
        }

        //判断正在解析的元素是否有属性值,如果有则将其全部取出并保存到map对象中，如:<person id="00001"></person>
        if(attributes!=null&&contentEntity!=null){
            for(int i=0;i<attributes.getLength();i++){
                switch (attributes.getQName(i)){
                    case "width":
                        svgEntity.setWidth(Float.parseFloat(attributes.getValue(i)));
                        break;
                    case "height":
                        svgEntity.setHeight(Float.parseFloat(attributes.getValue(i)));
                        break;
                    case "x":
                        String disx=attributes.getValue(i);
                        String zhi;
                        if(disx.contains("%")){
                            zhi=disx.substring(0,disx.indexOf("%"));
                        }else{
                            zhi=disx;
                        }
                        contentEntity.setDisx(Integer.parseInt(zhi));
                        break;
                    case "style":
                        //具体样式：0:纯文字 1:line 2:商品单 3：二维码
                        String attrValue=attributes.getValue(i);
                            String[] styles=attrValue.split(";");

                            for(int k=0;k<styles.length;k++){

                                if(styles[k].contains("linewrap"))contentEntity.setLinewrap(1);//判断打印本内容结束后是否换行

                                if(styles[k].contains("font-size:")){
                                    String values=styles[k].substring(styles[k].indexOf("font-size:")+10,styles[k].indexOf("px"));
                                    contentEntity.setFontSize(Float.parseFloat(values));//设置text的大小
                                }
                                if(styles[k].contains("font-weight:")){
                                    String values=styles[k].substring(styles[k].indexOf("font-weight:")+12);//设置是否加粗
                                    if(values.contains("bold"))contentEntity.setBold(1);
                                    else contentEntity.setBold(0);
                                }
                                if(styles[k].contains("text-align:")){//设置text的对齐方式
                                    String values=styles[k].substring(styles[k].indexOf("text-align:")+11);
                                    if(values.contains("left")){
                                        contentEntity.setAlign(0);
                                    }else if(values.contains("center")){
                                        contentEntity.setAlign(1);
                                    }else if(values.contains("right")){
                                        contentEntity.setAlign(2);
                                    }
                                }
                                if(styles[k].contains("qrcode:")){//设置图片或者二维码的宽高
                                    String values=styles[k].substring(styles[k].indexOf("qrcode:")+7);
                                    String s[]=values.split(" ");
                                    contentEntity.setPwidth(Integer.parseInt(s[0]));
                                    contentEntity.setPheight(Integer.parseInt(s[1]));
                                    contentEntity.setCategory(3);//代表二维码
                                }
                                if(styles[k].contains("table:")){//设置商品单的行、列数
                                    String values=styles[k].substring(styles[k].indexOf("table:")+6);
                                    String s[]=values.split(" ");
                                    contentEntity.setRow(Integer.parseInt(s[0]));
                                    contentEntity.setColum(Integer.parseInt(s[1]));
                                    contentEntity.setCategory(2);//代表商品单
                                }

                            }
                        break;

                }

            }
        }
        currentTag=qName;  //正在解析的元素
    }

    //解析到每个元素的内容时会调用此方法
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        if(currentTag!=null&&contentEntity!=null){
            currentValue=new String(ch,start,length);
            //如果内容不为空和空格，也不是换行符则将该元素名和值和存入map中
            if(currentValue!=null){
               contentEntity.setContent(currentValue);
            }
            //当前的元素已解析过，将其置空用于下一个元素的解析
            currentTag=null;
            currentValue=null;
        }
    }

    //每个元素结束的时候都会调用该方法
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        //判断是否为一个节点结束的元素标签
        if(qName.equals(nodeNameText)||qName.equals(nodeNameLine)){
           list.add(contentEntity);
            contentEntity=null;
        }
    }

    //结束解析文档，即解析根元素结束标签时调用该方法
    @Override
    public void endDocument() throws SAXException {
        svgEntity.setContents(list);
        super.endDocument();
    }
}